﻿//=============================================================================
//【 BitmapTextRenderer 】
//-----------------------------------------------------------------------------
///**
//  @file       BitmapTextRenderer.h
//  @brief      BitmapTextRenderer
//  @author     Riki
//*/
//=============================================================================

#pragma once

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
#include "../../Math/Vector4.h"
#include "../Interface.h"

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
namespace LNote
{
namespace Core
{
namespace Graphics
{

//=============================================================================
// ■ BitmapTextRenderer クラス
//-----------------------------------------------------------------------------
///**
//  @brief      テクスチャ等に文字を描画するクラス
//*/
//=============================================================================
class BitmapTextRenderer
    : public Base::NonCopyable
{
public:

	/// コンストラクタ
    explicit BitmapTextRenderer( LNGraphicsAPI api_ );

	/// デストラクタ
    ~BitmapTextRenderer();

public:

	//---------------------------------------------------------------------
	///**
	//  @brief      描画先となるビットマップバッファを設定する
	//
	//  @param[in]  buffer_ : 書き込みを行うメモリバッファアドレス
	//  @param[in]  width_  : イメージの横幅
	//  @param[in]  height_ : イメージの高さ
	//
	//  @par
	//              1 ピクセルを ARGB の 32 ビットカラーとして書き込みます。
	//*/
	//---------------------------------------------------------------------
    void setTargetBuffer( void* buffer_, lnU32 width_, lnU32 height_ );

	//---------------------------------------------------------------------
	///**
	//  @brief      文字列の描画に使うフォントを設定する
	//*/
	//---------------------------------------------------------------------
    void setFont( IFont* font_ );

	//---------------------------------------------------------------------
	///**
	//  @brief      文字列を描画する
	//
	//  @param[in]  text_  : 描画する文字列
	//  @param[in]  rect_  : 描画領域
	//  @param[in]  align_ : テキストアラインの設定
	//  @param[in]  len_   : 描画する文字数 (-1 を指定すると終端まで描画する)
	//
	//  @par
	//              テキストアラインはビットマップの幅ではなく rect_ を基準として行います。<br>
	//              例えば文字列を右揃えとした場合、rect_.x + rect_.width を
	//              右端として描画を行います。
	//*/
	//---------------------------------------------------------------------
    LNRESULT drawText( const lnChar* text_, const Geometry::Rect& rect_, LNTextAlign align_ = LN_TEXTALIGN_LEFT, int len_ = -1 );

private:

	/// 1行分の描画
    LNRESULT _drawLine( const lnChar* text_, int len_, int l_, int t_, int r_, int b_, lnU32 color_, int* write_len_ );
    
private:

    LNGraphicsAPI   mGraphicsAPI;       ///< 色コード変換に使う
    lnU32*		    mBitmapBuffer;
    lnU32			    mWidth;
	lnU32			    mHeight;
    IFont*		    mFont;
};

//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------

} // namespace Graphics
} // namespace Core

} // namespace LNote

//=============================================================================
//
//=============================================================================